﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using SeguridadGaleria;
using AvalonDock;
using ModeloGaleriaNET;

namespace GaleriaNET
{
    /// <summary>
    /// Lógica de interacción para ucNuevoGrupo.xaml
    /// </summary>
    public partial class ucNuevoGrupo : UserControl
    {
        private readonly string title;
        private BackgroundWorker worker;
        private bool loaded;
        private List<string> nombresGruposExistentes;
        private List<string> permisos;
        private ManejadorRoles roleManager;
        private IAuditoria auditoria;

        public ucNuevoGrupo()
        {
            InitializeComponent();
            title = "Creación de grupo de usuarios";
            worker = new BackgroundWorker();
            worker.DoWork += worker_DoWork;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            loaded = false;
            roleManager = ManejadorRoles.Instance;
            auditoria = new AuditoriaBD();
        }

        public string Title
        {
            get { return title; }
        }

        private void lbPermisos_Loaded(object sender, RoutedEventArgs e)
        {
            if (!loaded)
            {
                if (!worker.IsBusy)
                    worker.RunWorkerAsync();
                loaded = true;
            }
        }

        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            permisos = roleManager.GetAllPermisos();
            nombresGruposExistentes = roleManager.GetNombresGrupos();
        }

        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Xceed.Wpf.Toolkit.Primitives.SelectorItem item;

            if (permisos != null)
            {
                foreach (string permiso in permisos)
                {
                    item = new Xceed.Wpf.Toolkit.Primitives.SelectorItem();
                    item.Content = permiso;
                    clbPermisos.Items.Add(item);
                }
            }
        }

        private void btCancelar_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(tbNombre.Text) ||
                clbPermisos.SelectedItems.Count > 0)
            {
                if (Xceed.Wpf.Toolkit.MessageBox.Show("¿Desea salir sin guardar los cambios?", "Salir sin guardar",
                    MessageBoxButton.YesNo, MessageBoxImage.Question)
                    == MessageBoxResult.Yes)
                    Close();
                else
                    return;
            }
        }

        private void Close()
        {
            ((DocumentContent)this.Parent).Close();
        }

        private void btAceptar_Click(object sender, RoutedEventArgs e)
        {
            GrupoValue grupo;
            List<string> permisos;
            ucGruposRoles grupos;
            DocumentContent padre;
            int uId;

            if (string.IsNullOrWhiteSpace(tbNombre.Text))
            {
                Xceed.Wpf.Toolkit.MessageBox.Show("Debes darle un nombre al grupo", "Error",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else if (clbPermisos.SelectedItems.Count <= 0)
            {
                Xceed.Wpf.Toolkit.MessageBox.Show("Debes seleccionar al menos un permiso para el grupo", "Error",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            else if (nombresGruposExistentes.Contains(tbNombre.Text.ToLower().Replace(" ", string.Empty)))
            {
                Xceed.Wpf.Toolkit.MessageBox.Show("Este nombre de grupo ya existe", "Error",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            else // Datos correctos, crear grupo
            {
                grupo = new GrupoValue();
                permisos = new List<string>();
                uId = Convert.ToInt32(Utilities.FindUsuarioData(typeof(UserWindow), this, "Id"));
                grupo.Nombre = tbNombre.Text;

                foreach (object item in clbPermisos.Items)
                {
                    if (Convert.ToBoolean(item.GetType().GetProperty("IsSelected").GetValue(item, null)))
                        permisos.Add(Convert.ToString(item.GetType().GetProperty("Content").GetValue(item, null)));
                }
                grupo.Permisos = permisos.ToArray();

                auditoria.Mensaje(new object[] { grupo.Nombre }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.INICIO_CREAR_GRUPO_ROLES), uId);
                System.Threading.Thread.Sleep(1000);
                if (roleManager.CrearGrupo(grupo))
                {
                    if ((padre = (DocumentContent)(FindDocumentContent(typeof(ucGruposRoles)))) != null)
                    {
                        grupos = (ucGruposRoles)(padre.Content);
                        grupos.Actualizar();
                        Close();
                    }
                    auditoria.Mensaje(new object[] { grupo.Nombre }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.CREAR_GRUPO_ROLES), uId);
                    System.Threading.Thread.Sleep(1000);
                    Xceed.Wpf.Toolkit.MessageBox.Show("Grupo creado con éxito", "Grupo creado", MessageBoxButton.OK, MessageBoxImage.Information);
                }
                else
                {
                    auditoria.Mensaje(new object[] { grupo.Nombre }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_CREAR_GRUPO_ROLES), uId);
                    System.Threading.Thread.Sleep(1000);
                    Xceed.Wpf.Toolkit.MessageBox.Show("No se ha podido crear el grupo en el servidor", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                Close();
            }
        }

        private DocumentContent FindDocumentContent(Type t)
        {
            DockingManager manager;

            manager = ((DocumentContent)this.Parent).Manager;
            // Buscamos si hay abierta una instancia del documento a abrir
            foreach (AvalonDock.DocumentContent doc in manager.Documents)
            {
                if (doc.Content.GetType() == t)
                    return doc;
            }
            return null;
        }
    }
}
